package com.ktjy.ktmall.service.impl;

import cn.hutool.core.util.CharUtil;
import com.ktjy.ktmall.dao.AddressDao;
import com.ktjy.ktmall.dao.GoodsItemDao;
import com.ktjy.ktmall.dao.OrderDao;
import com.ktjy.ktmall.dao.SkuItemDao;
import com.ktjy.ktmall.dao.impl.AddressDaoImpl;
import com.ktjy.ktmall.dao.impl.GoodsItemDaoImpl;
import com.ktjy.ktmall.dao.impl.OrderDaoImpl;
import com.ktjy.ktmall.dao.impl.SkuItemDaoImpl;
import com.ktjy.ktmall.entity.*;
import com.ktjy.ktmall.service.OrderService;
import com.ktjy.ktmall.util.CharUtils;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 订单模块业务逻辑层接口实现类
 * @version v1.0
 * @Author 郴州科泰
 * @Create 2024-08-07 - 20:20
 */
public class OrderServiceImpl implements OrderService {
    OrderDao orderDao = new OrderDaoImpl();
    // 下单
    @Override
    public int saveOrder(Order order) {
        // 订单流水号，CharUtils为自定义的工具类
        String orderSn = CharUtils.getRandomString(6).toUpperCase() +
                new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
        order.setOrderSn(orderSn);
        // 往订单表中新增一条记录,返回新增后的订单ID
        int orderId = orderDao.saveOrder(order);
        // 新增订单详情
        if (order.getGoods() != null && order.getGoods().size() > 0) {
            for (OrderDetail detail : order.getGoods()) {
                detail.setOrderId(orderId);
                orderDao.saveOrderDetail(detail);
            }
        }
        return orderId; // 返回订单id
    }

    AddressDao addressDao = new AddressDaoImpl();
    SkuItemDao skuDao = new SkuItemDaoImpl();
    GoodsItemDao goodsDao = new GoodsItemDaoImpl();
    /**
     * 通过订单id查询详情详情
     * @param id 订单id
     * @return 返回订单详情信息
     */
    @Override
    public Order findById(int id) {
        // 1、通过订单id查询订单的信息
        Order o = orderDao.findById(id);
        // 2、通过地址id查询地址详情信息
        o.setAddress(addressDao.findById(o.getAddressId()));
        // 3、通过订单id到t_order_detail表中查询此详情的详情信息。
        List<OrderDetail> odList = orderDao.findByOrderId(o.getId());
        odList = odList.stream().map((od) -> {
            // 2.1 通过sku的id查询sku的详情信息
            SkuItem sku = skuDao.findById(od.getSkuId());
            // 2.2 通过sku的id查询商品sku具体的商品信息
            GoodsItem goods = goodsDao.findById(sku.getGoodsId());
            sku.setGoods(goods); // 为sku赋值商品信息
            od.setSkuItem(sku);  // 为OrderDetail订单详情对象赋值sku对象
            od.setCurPrice(new BigDecimal("0.9").multiply(sku.getPrice()).setScale(2)); // 购买时单价(打9折)
            od.setName(goods.getGoodsName()); // 商品名
            od.setPicture(sku.getPicture()); // 商品sku的图片
            return od; // 如此订单详情对象中就会有SKU和商品的详情信息
        }).collect(Collectors.toList());
        // 将订单详情列表odList赋值给o订单对象。
        o.setGoods(odList);

        return o;
    }

    /**
     * 根据订单状态查询订单总数
     * @param orderState 订单状态
     */
    @Override
    public int getCount(int userId, int orderState) {
        return orderDao.getCount(userId, orderState);
    }

    /**
     * 按订单状态分页查询订单列表数据
     * @param currPageNo 当前页码
     * @param pageSize 每页显示的数据行数
     * @param orderState 订单状态
     */
    @Override
    public List<Order> getOrderListPage(Integer currPageNo, Integer pageSize, int userId, int orderState) {
        Integer from = (currPageNo - 1) * pageSize;
        List<Order> list = orderDao.getOrderListPage(from, pageSize, userId, orderState);
        // 1、调用list集合，为查询每个Order订单对象的详情信息
        list.stream().map((o) -> {
            // 2、通过地址id查询地址详情信息
            o.setAddress(addressDao.findById(o.getAddressId()));
            // 3、通过订单id到t_order_detail表中查询此详情的详情信息。
            List<OrderDetail> odList = orderDao.findByOrderId(o.getId());
            odList = odList.stream().map((od) -> {
                // 2.1 通过sku的id查询sku的详情信息
                SkuItem sku = skuDao.findById(od.getSkuId());
                // 2.2 通过sku的id查询商品sku具体的商品信息
                GoodsItem goods = goodsDao.findById(sku.getGoodsId());
                sku.setGoods(goods); // 为sku赋值商品信息
                od.setSkuItem(sku);  // 为OrderDetail订单详情对象赋值sku对象
                od.setCurPrice(new BigDecimal("0.9").multiply(sku.getPrice()).setScale(2)); // 购买时单价(打9折)
                od.setName(goods.getGoodsName()); // 商品名
                od.setPicture(sku.getPicture()); // 商品sku的图片
                return od; // 如此订单详情对象中就会有SKU和商品的详情信息
            }).collect(Collectors.toList());
            // 将订单详情列表odList赋值给o订单对象。
            o.setGoods(odList);
            return o;
        }).collect(Collectors.toList());

        return list;
    }

    // 更新订单状态
    @Override
    public int updatePayStatus(Order orderInfo) {
        return orderDao.updatePayStatus(orderInfo);
    }

}
